package com.xiaohu.service;

import com.xiaohu.common.ResultEntity;
import com.xiaohu.dao.DeptDao;
import com.xiaohu.entity.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service//为spring注入bean
public class DeptService {

    @Autowired
    private DeptDao deptDao;

    /**
     * 根据条件查询部门信息
     *
     * @param dept 查询条件
     * @return
     */
    public ResultEntity selectAll(Dept dept) {
        // 根据部门查询部门信息
        List<Dept> depts = deptDao.selectAll(dept);
        // 查询部门的总条数，分页时需要知道总共有多少数据
        int count = deptDao.selectCount();
        return new ResultEntity(ResultEntity.OK, ResultEntity.QUERY_OK, count, depts);
    }

    /**
     * 新增部门
     *
     * @param dept 新增数据
     * @return
     */
    public ResultEntity add(Dept dept) {
        //todo 页面传来的dept是四个值，有些字段是默认值，需要在这里处理一下
        dept.setOpen("0");
        dept.setAvailable("0");
        dept.setOrdernum("0");
        int add = deptDao.add(dept);

        if (add == 1) {
            return new ResultEntity(ResultEntity.OK, ResultEntity.INSERT_OK, 0, ResultEntity.INSERT_OK);
        } else {
            return new ResultEntity(ResultEntity.ERROR, ResultEntity.INSERT_ERROR, 0, ResultEntity.INSERT_ERROR);
        }
    }

    /**
     * 根据Id获取这一条对应的数据
     *
     * @param id 部门编号
     * @return
     */
    public Dept getDept(String id) {
        List<Dept> depts = deptDao.selectAll(new Dept());
        for (Dept dept : depts) {
            if (id.equals(dept.getId())) {
                return dept;
            }
        }
        return null;
    }

    /**
     * 编辑部门
     *
     * @param dept 编辑信息
     * @return
     */
    public ResultEntity edit(Dept dept) {
        int flag = deptDao.update(dept);
        if (flag == 1) {
            return new ResultEntity(ResultEntity.OK, ResultEntity.UPDATE_OK, 0, ResultEntity.UPDATE_OK);
        } else {
            return new ResultEntity(ResultEntity.ERROR, ResultEntity.UPDATE_ERROR, 0, ResultEntity.UPDATE_ERROR);
        }
    }

    /**
     * 删除部门
     *
     * @param id 部门id
     * @return 统一返回值
     */
    public ResultEntity delete(String id) {
        Dept dept = new Dept();
        dept.setId(id);
        dept.setAvailable("1");

        // 删除操作其实是一个逻辑删除，通过操作available的值，来实现
        int flag = deptDao.update(dept);
        if (flag == 1) {
            return new ResultEntity(ResultEntity.OK, ResultEntity.DELETE_OK, 0, ResultEntity.DELETE_OK);
        } else {
            return new ResultEntity(ResultEntity.ERROR, ResultEntity.DELETE_ERROR, 0, ResultEntity.DELETE_ERROR);
        }
    }

    /**
     * 批量删除部门
     *
     * @param ids 部门编号的集合
     * @return
     */
    public ResultEntity batchDelete(List<String> ids) {
        for (String id : ids) {
            Dept dept = new Dept();
            dept.setId(id);
            dept.setAvailable("1");
            deptDao.update(dept);
        }
        return new ResultEntity(ResultEntity.OK, ResultEntity.DELETE_OK, 0, ResultEntity.DELETE_OK);
    }

    /**
     * 部门下拉框查询
     *
     * @return
     */
    public ResultEntity deptSelect() {
        List<Dept> deptList = deptDao.deptSelect();
        return new ResultEntity(ResultEntity.OK, ResultEntity.QUERY_OK, deptList.size(), deptList);
    }

    /**
     * 将部门结构展示成树形结构
     *
     * @return
     */
    public ResultEntity tree() {
        List<Dept> deptList = deptDao.deptSelect();
        // 获取根节点
        Dept rootDept = this.getRootDept(deptList);
        if (rootDept == null) {
            return new ResultEntity(ResultEntity.ERROR, ResultEntity.QUERY_ERROR + "，部门树形结构构建失败，未找到根节点",
                    deptList.size(), null);
        }

        // 从根节点递归，设置子部门
        Dept dept = this.setChildren(rootDept, deptList);

        // 返回结果封装
        List<Dept> finalDeptList = new ArrayList<>();
        finalDeptList.add(dept);

        return new ResultEntity(ResultEntity.OK, ResultEntity.QUERY_OK, deptList.size(), finalDeptList);
    }

    /**
     * 获取根节点（规定：pid=0的为根节点）
     *
     * @param deptList 所有的部门数据
     * @return
     */
    private Dept getRootDept(List<Dept> deptList) {
        for (Dept dept : deptList) {
            if ("0".equals(dept.getPid())) {
                return dept;
            }
        }
        return null;
    }

    /**
     * 从根节点递归，设置子部门
     *
     * @param dept     部门信息（默认从根节点开始递归）
     * @param deptList 所有部门数据
     * @return
     */
    private Dept setChildren(Dept dept, List<Dept> deptList) {
        String id = dept.getId();
        List<Dept> children = this.getChildren(id, deptList);
        dept.setChildren(children);
        if (children.size() > 0) {
            for (Dept child : children) {
                // 递归
                this.setChildren(child, deptList);
            }
        }
        return dept;
    }


    /**
     * 根据部门编号，获取所有的子部门
     *
     * @param id      部门编号
     * @param allDept 所有部门集合
     * @return 子部门信息
     */
    private List<Dept> getChildren(String id, List<Dept> allDept) {
        List<Dept> children = new ArrayList<>();
        for (Dept dept : allDept) {
            if (id.equals(dept.getPid())) {
                children.add(dept);
            }
        }
        return children;
    }


}
